<?php
class LogsRecordListener extends Doctrine_Record_Listener
{
	protected $operation_start;
	protected $manager;
	
	//constantes com os valores da bd com os codigos das accoes, para evitar mais hits na BD.
	const OPERARTION_INSERT = 1;
	const OPERARTION_UPDATE = 2;
	const OPERARTION_DELETE = 3;
	
	public function LogsRecordListener(){
		$this->manager = Doctrine_Manager::getInstance();
	}
	
	public function preInsert(Doctrine_Event $event) {
		$this->operation_start = time();
    }
    
	public function postInsert(Doctrine_Event $event) {
		/*if(session_id() && strcasecmp($_SESSION['tipo_sessao'], Utilizadores::utilizador_sistema) == 0){
			
		}*/
		# verificação de user desactivado
		$this->manager->setCurrentConnection('logs_connection');
		$query = new Doctrine_Query();
		$tabela = $query->from("Tabelas")->where("nome = ? and is_monitoring = 1", array($event->getInvoker()->getTable()->getTableName()))
				->fetchOne(array(), Doctrine::HYDRATE_ARRAY);
		$query->free();
		if ($tabela){
			$operacao = new Operacoes();
			$id = array_values($event->getInvoker()->identifier());
			$operacao->id_interno = $id[0];
			$operacao->accao_id = self::OPERARTION_INSERT;
			$operacao->descricao = "";
			$operacao->tabela_id = $tabela['id'];
			$campos_inseridos = $event->getInvoker()->getData();
			foreach ($campos_inseridos as $campo => $old_value){
				$campo_alterado = new CamposAlterados();
				$campo_alterado->campo = $campo;
				$campo_alterado->old_value = null;
				$campo_alterado->new_value = $event->getInvoker()->get($campo);
				$operacao->CamposAlterados[] = $campo_alterado;
			}
			$operacao->time_elapsed = time() - $this->operation_start;
			$_SESSION['current_transaction']->Operacoes[] = $operacao;
		}
		$this->manager->setCurrentConnection('base_connection');
	}
	
	public function preUpdate(Doctrine_Event $event){
		$this->operation_start = time();
    }
	
	public function postUpdate(Doctrine_Event $event) {
		/*if(session_id() && strcasecmp($_SESSION['tipo_sessao'], Utilizadores::utilizador_sistema) == 0){
			
		}*/
		# verificação de user desactivado
		$this->manager->setCurrentConnection('logs_connection');
		$query = new Doctrine_Query();
		$tabela = $query->from("Tabelas")->where("nome = ? and is_monitoring = 1", array($event->getInvoker()->getTable()->getTableName()))
				->fetchOne(array(), Doctrine::HYDRATE_ARRAY);
		$query->free();
		if ($tabela){
			$operacao = new Operacoes();
			$id = array_values($event->getInvoker()->identifier());
			$operacao->id_interno = $id[0];
			$operacao->accao_id = self::OPERARTION_UPDATE;
			$operacao->descricao = "";
			$operacao->tabela_id = $tabela['id'];
			$campos_alterados = $event->getInvoker()->getLastModified(true);
			foreach ($campos_alterados as $campo => $old_value){
				$campo_alterado = new CamposAlterados();
				$campo_alterado->campo = $campo;
				$campo_alterado->old_value = $old_value;
				$campo_alterado->new_value = $event->getInvoker()->get($campo);
				$operacao->CamposAlterados[] = $campo_alterado;
			}
			$operacao->time_elapsed = time() - $this->operation_start;
			$_SESSION['current_transaction']->Operacoes[] = $operacao;
		}
		$this->manager->setCurrentConnection('base_connection');
	}
    
	public function preDelete(Doctrine_Event $event) {
		$this->operation_start = time();
	}
	
	public function postDelete(Doctrine_Event $event){
		/*if(session_id() && strcasecmp($_SESSION['tipo_sessao'], Utilizadores::utilizador_sistema) == 0){
			
		}*/
		# verificação de user desactivado
		$this->manager->setCurrentConnection('logs_connection');
		$query = new Doctrine_Query();
		$tabela = $query->from("Tabelas")->where("nome = ? and is_monitoring = 1", array($event->getInvoker()->getTable()->getTableName()))
				->fetchOne(array(), Doctrine::HYDRATE_ARRAY);
		$query->free();
		if ($tabela){
			$operacao = new Operacoes();
                $id = array_values($event->getInvoker()->identifier());
			$operacao->id_interno = $id[0];
			$operacao->accao_id = self::OPERARTION_DELETE;
			$operacao->descricao = "";
			$operacao->tabela_id = $tabela['id'];
			$campos_eliminados = $event->getInvoker()->getData();
			foreach ($campos_eliminados as $campo => $old_value){
				$campo_alterado = new CamposAlterados();
				$campo_alterado->campo = $campo;
				$campo_alterado->old_value = $old_value;
				$campo_alterado->new_value = null;
				$operacao->CamposAlterados[] = $campo_alterado;
			}
			$operacao->time_elapsed = time() - $this->operation_start;
			$_SESSION['current_transaction']->Operacoes[] = $operacao;
		}
		$this->manager->setCurrentConnection('base_connection');
	}
}
?>